package org.hales.util;

import lombok.extern.slf4j.Slf4j;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;

/**
 * DES加密 解密算法
 *
 * @author lifq
 * @date 2015-3-17 上午10:12:11
 */
@Slf4j
public class DesUtil {
  private static final String DES = "DES";
  private static final String ENCODE = "Utf8";
  private static final String defaultKey = "chengdu123";


  public static void main(String[] args) throws Exception {
    System.out.println(encrypt("11"));
  }
  /**
   * 使用 默认key 加密
   *
   * @return String
   * @author lifq
   * @date 2015-3-17 下午02:46:43
   */
  public static String encrypt(String data){
    try{
      byte[] bt = encrypt(data.getBytes(ENCODE), defaultKey.getBytes(ENCODE));
      return new BASE64Encoder().encode(bt);
    }catch (Exception ex){
      log.error("使用des  encrypt 失败，错误信息是：{}",ex.getMessage());
    }
    return null;

  }

  /**
   * 使用 默认key 解密
   *
   * @return String
   * @author lifq
   * @date 2015-3-17 下午02:49:52
   */
  public static String decrypt(String data) {
    if (data == null) return null;
    BASE64Decoder decoder = new BASE64Decoder();
    try {
      byte[] buf = decoder.decodeBuffer(data);
      byte[] bt = decrypt(buf, defaultKey.getBytes(ENCODE));
      return new String(bt, ENCODE);
    } catch (Exception e) {
      log.error("解密失败，错误信息：{}",e.getMessage());
      return null;
    }
  }

  /**
   * Description 根据键值进行加密
   *
   * @param data
   * @param key 加密键byte数组
   * @return
   * @throws Exception
   */
  private static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    // 生成一个可信任的随机数源
    SecureRandom sr = new SecureRandom();

    // 从原始密钥数据创建DESKeySpec对象
    DESKeySpec dks = new DESKeySpec(key);

    // 创建一个密钥工厂，然后用它把DESKeySpec转换成SecretKey对象
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
    SecretKey securekey = keyFactory.generateSecret(dks);

    // Cipher对象实际完成加密操作
    Cipher cipher = Cipher.getInstance(DES);

    // 用密钥初始化Cipher对象
    cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

    return cipher.doFinal(data);
  }

  /**
   * Description 根据键值进行解密
   *
   * @param data
   * @param key 加密键byte数组
   * @return
   * @throws Exception
   */
  private static byte[] decrypt(byte[] data, byte[] key) throws Exception {
    // 生成一个可信任的随机数源
    SecureRandom sr = new SecureRandom();

    // 从原始密钥数据创建DESKeySpec对象
    DESKeySpec dks = new DESKeySpec(key);

    // 创建一个密钥工厂，然后用它把DESKeySpec转换成SecretKey对象
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
    SecretKey securekey = keyFactory.generateSecret(dks);

    // Cipher对象实际完成解密操作
    Cipher cipher = Cipher.getInstance(DES);

    // 用密钥初始化Cipher对象
    cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

    return cipher.doFinal(data);
  }
}
